Patrones de comportamiento: Command, Interpreter y Observer

Introducción

Orientados a la comunicación e interacción entre objetos y el control de flujo del proceso.

Los patrones de comportamiento tienen que ver con diferentes aspectos:

 

Command (Orden)

El patrón command tiene como objetivo encapsular en un objeto cada función. como sustituto de otro para controlar el acceso del mismo. De esta forma se puede parametrizar a los clientes con diferentes peticiones, incluir las peticiones en una cola o incluso llevar un registro de las peticiones efectuadas y poder hacer así las operaciones.

Ejemplo:

  1. Un mando de control remoto que permita controlar todos los dispositivos controlables de una casa: aire acondicionado, calefacción, televisión, luces, persianas, alarma, etc.

    El mando de control remoto también debe permitir incorporar en el futuro nuevos dispositivos.

    Se dispone de un conjunto de clases, una por cada dispositivo controlable. Cada clase tiene métodos para operar directamente con el dispositivo.

     

    CLASES ASOCIADAS A LOS DISPOSITIVOS


     

     

    Observando las distintas clases de los dispositivos, se ve que cada una tiene una interfaz distinta.

    Sin embargo, las funciones que se pueden asociar a los distintos botones del mando tienen una forma común.

    Cada función tiene:

    • Un receptor concreto.

    • Una acción concreta sobre el receptor.

     

    Receptor-accion

 

Debemos utilizar este patrón cuando:

 

Ventajas e inconvenientes del patrón Adapter:

 

Estructura

 

Command

 

Implementación

 

CommandMinimando

 

PASO 1: CREACIÓN DE LOS DISPOSITIVOS

 

PASO 2: CREACIÓN DE LAS ORDENES

2.1 Creación de la interface

 

2.2 Creación de las ordenes concretas

 

PASO 3: CREACIÓN DE LOS INVOCADORES

 

PASO 4: CODIFICACIÓN DEL CLIENTE

 

Interpreter (Interprete)

Para comprender este patrón es necesario conocer el concepto de gramática formal.

Una gramática es un conjunto de reglas que define un lenguaje concreto (se llaman reglas de derivación).

Por ejemplo, un lenguaje para escribir expresiones lógicas del tipo 0 AND 1, 1 OR (0 AND 1), etc, puede definirse con la siguiente gramática:

 

exp = exp op exp exp = booleano
booleano = 0
op = ADN
exp = booleano
booleano = 1


 

 

 

El árbol de análisis de la expresión 1 OR (0 AND 1) sería:

 

Arbol_sintaxis_1OR(0AND1)

 

El patrón interpreter, dado un lenguaje simple, define una representación de su gramática junto con un intérprete que utiliza dicha representación para interpretar sentencias del lenguaje.

Ejemplo:

  1. Una sentencia booleana:

    • Se puede evaluar: “interpretar” = “evaluar”

    • Se puede traducir a otro lenguaje: “interpretar” = “traducir”

 

El uso de este patrón no se limita solamente a la interpretación de expresiones booleanas o aritméticas.

Se puede utilizar en todos los casos en los que se pueda expresar un problema mediante una gramática.

Por ejemplo, se puede utilizar en una aplicación que trabaje con fórmulas químicas. Se puede considerar que interpretar una fórmula química consiste en calcular su masa molecular.

También se podría usar este patrón en una aplicación de gestión de menús de comida. Los menús serían las sentencias del lenguaje. Interpretar un menú podría ser validar si es equilibrado. El contexto podría almacenar información de los distintos platos.

 

Ventajas e inconvenientes del patrón Adapter:

 

Estructura

 

Interpreter

 

Implementación

 

InterpreterEvaluadorExpresiones

 

PASO 1: CREACIÓN DE INTERFACE DE EXPRESIONES

 

PASO 2: CREACIÓN DE LAS CLASES PARA LAS EXPRESIONES TERMINALES

 

PASO 3: CREACIÓN DE LAS CLASES PARA LAS REGLAS DE LOS NO TERMINALES

 

PASO 5: CREACIÓN DE LA CLASE OPERACIÓN (ES LA QUE INTERPRETA)

 

PASO 5: CODIFICACIÓN DEL CLIENTE

 

Observer (Observador)

El patrón observador proporciona un mecanismo para que los cambios de estado de un objeto sean notificados a otros objetos que previamente se han registrado para ello.

 

Notificaciones_observador

 

Define una relación uno a muchos entre un conjunto de objetos.

Cuando el estado de un objeto cambia, los objetos dependientes son notificados.

 

Notificaciones_observador

 

Ejemplo:

  1. Un hospital que muestra por pantalla la evolución de los procesos de los pacientes en quirófano.

  2. Las pantallas de los aeropuertos que indican las puertas de embarque.

  3. Aplicación que muestra en dos ventanas diferentes los datos meteorológicos de temperatura, humedad y presión que se recogen de unos sensores cada cierto intervalo de tiempo. Con esa misma frecuencia, se deben actualizar las dos ventanas que muestran los datos. Una de ellas muestra los datos actuales de las tres variables, y la otra los valores máximos y mínimos de dos de ellas. En un futuro se prevé que habrá nuevas ventanas.

     

    Interface_metereologia

     

Hay dos modelos para transmitir la información del cambio de estado del sujeto:

Si la relación de dependencia entre sujetos y observadores es compleja, puede ser necesario un objeto (Gestor) que mantenga dichas relaciones.

 

Observador_con_gestor

 

 

Ventajas e inconvenientes del patrón Observador:

 

Estructura

 

Observer

 

Implementación

Observador PUSH

ObserverPUSH

 

PASO 1: CREACIÓN DE INTERFACES

 

PASO 2: CREACIÓN DEL SUJETO CONCRETO

 

PASO 3: CREACIÓN DE LOS OBSERVADORES CONCRETOS

 

PASO 4: CODIFICACIÓN DEL CLIENTE

 

Observador PULL

ObserverPULL

 

PASO 1: CREACIÓN DE INTERFACES

 

PASO 2: CREACIÓN DEL SUJETO CONCRETO

 

PASO 3: CREACIÓN DE LOS OBSERVADORES CONCRETOS

 

PASO 4: CODIFICACIÓN DEL CLIENTE

 

by Jose Manuel Pinillos